package org.deep.cmd;

import org.deep.ByteUtil;

/**
 * 单次指令
 * 用于一发一收情况
 *
 * @param <T> 指令解析返回的类型
 */
public abstract class SingleCmd<T> extends BaseCmd<T> {
    /**
     * 指令重发次数
     */
    public final int reSendTimes;
    /**
     * 指令重发间隔
     */
    public final int reSendInterval;

    protected SingleCmd(int receiveSize, int reSendTimes, int reSendInterval) {
        super(receiveSize);
        this.reSendTimes = reSendTimes;
        this.reSendInterval = reSendInterval;
    }

    /**
     * 定义需要发送的数据
     *
     * @return 需要发的数据
     */
    public abstract byte[] send();

    /**
     * 处理数据且进行校验
     * @param buf 需要处理的数据
     * @return 返回指令解析的结果
     * @throws HandleException 处理失败异常
     * @throws CheckException 校验失败异常
     */
    public T handleWithCheck(byte[] buf) throws HandleException, CheckException {
        if (check(buf)) {
            try {
                return handle(buf);
            } catch (Exception e) {
                throw new HandleException(String.format("%s", e));
            }
        }
        throw new CheckException();
    }

    /**
     * 需要发送的数据格式化为16进制字符串
     * @return 格式化后的字符串
     */
    public String sendConentToHexString() {
        return ByteUtil.conentToHexString(send(), true, 20);
    }
}
